parser grammar AnasintANTLR;

options {
  language = Java;
  tokenVocab = AnalexANTLR;
}

@header {
    package practica6;
}


@members {
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
}

entrada: analizador opciones cabecera? reglas*;

analizador: (PARSER|LEXER) GRAMMAR IDENT PUNTO_COMA;

opciones: OPTIONS LLAVE_A (IDENT IGUAL IDENT PUNTO_COMA)* LLAVE_C;

cabecera: HEADER LLAVE_A PACKAGE IDENT PUNTO_COMA LLAVE_C;

reglas: REGLA DOS_PUNTOS contenido_regla PUNTO_COMA;

contenido_regla: (regla_simple|regla_condicional)*;

regla_simple: PARENTESIS_A? (TOKEN|REGLA) PARENTESIS_C? (ASTERISCO|INTERROG)?;

regla_condicional: PARENTESIS_A (TOKEN|REGLA) (ASTERISCO|INTERROG)? (OR (TOKEN|REGLA) (ASTERISCO|INTERROG)?) PARENTESIS_C (ASTERISCO|INTERROG)?;

//reglas: REGLA DOS_PUNTOS (PARENTESIS_A? (regla_simple|regla_condicional) PARENTESIS_C?)* PUNTO_COMA;
//
//regla_simple: (TOKEN|REGLA) (ASTERISCO|INTERROG)?;
//
//regla_condicional: (TOKEN|REGLA) (ASTERISCO|INTERROG)? (OR (TOKEN|REGLA) (ASTERISCO|INTERROG)?)* (ASTERISCO|INTERROG)?;

//regla_compuesta: PARENTESIS_A? (regla_simple|regla_condicional)* PARENTESIS_C?;
